package app.mvp.base_mvp;

import android.content.Context;
import android.util.Log;

import java.util.HashMap;

import app.mvp.MainModel;
import app.mvp.api.ApiService;
import app.mvp.api.ResultDistribute;
import app.mvp.application.MVPFrameApplication;
import app.mvp.contract.LoginModel;
import app.mvp.utils.RSAUtils;
import app.mvp.utils.TUtil;
import http.CallBack;
import http.IWeiLiCaiResultDistribute;
import parameter.WeiLiCaiHttpParameters;
import retrofit.WeiLiCaiRetrofit;
import rx.Observable;

/**
 * Created by 刘智强 on 2017/4/11.
 * model基类
 */

public abstract class BaseModel<T> {
    public String appLoginKey; //服务器返回的登陆key
    public String userId;//用户的ID
    public ApiService apiService;//retroift请求需要的接口类
    public WeiLiCaiHttpParameters weiLiCaiHttpParameters;//参数处理类的对象
    public Observable observable;//网络请求被观察者对象
    public IWeiLiCaiResultDistribute distribute;//网络请求结果的分发接口对象
    private T model;//需要传入的泛型类型
    private boolean isLogin = false;//是否登陆


    public void init(Context context, HashMap<String, String> map, CallBack callBack) {
        model = TUtil.getClazz(this, 0);//获取泛型类型
        isLogin = MVPFrameApplication.getInstance().getUserBean() == null ? false : true;//是否登陆
        appLoginKey = MVPFrameApplication.getInstance().getUserBean() == null ? "" : MVPFrameApplication.getInstance().getUserBean().getApp_login_key();//登陆后返回的key
        userId = MVPFrameApplication.getInstance().getUserBean() == null ? "" : MVPFrameApplication.getInstance().getUserBean().getUser_id();//登陆后返回的id
        apiService = WeiLiCaiRetrofit.getRetrofit().create(ApiService.class);//获取网络访问的接口对象
        weiLiCaiHttpParameters = new WeiLiCaiHttpParameters(isLogin, appLoginKey, userId, RSAUtils.loadPublicKey());//参数处理的对象
        observable = apiService.login(weiLiCaiHttpParameters.postAllParameters(map));//获取被观察者对象
        distribute = new ResultDistribute(context, model.getClass(), callBack);//构建网络请求后的回调对象
    }

    /**
     * 获取网络的方法
     *
     * @param context            上下文
     * @param isGetDataFromCache 是否要从缓存中获取数据
     * @param cacheKey           获取缓存数据的key
     * @param map                装网络请求的参数集合
     * @param callBack           网络请求的回调
     */

    public void getModelFromNet(Context context, boolean isGetDataFromCache,
                                String cacheKey, HashMap<String, String> map, CallBack callBack) {
        init(context, map, callBack);
    }//从网络获取实体

    public abstract T getModelFromCache(Context context, String key);//从缓存获取实体

    public abstract void setCache(Context context, String key, T t);//设置缓存

}
